/**
 * 列表
 * 列表是一组有序的数据。
 * 每个列表中的数据项称为元素,列表中的元素可以是任意的数据类型。
 * 列表中可以保存多少个元素没有事先限定，实际的元素数量，受内存限制。
 */
class List {
    
    constructor() {
        this.pos = 0; // 当前位置
        this.listSize = 0; // 元素个数
        this.dataStore = []; // 存储元素的数组
    }

    /**
     * 获取元素的位置
     * @param ele
     * @returns {number}
     * @private
     */
    _find(ele) {
        let store = this.dataStore, len = store.length;

        for (let i = 0; i < len; i++) {
            if (store[i] === ele) {
                return i;
            }
        }
        return -1;
    }

    /**
     * 添加元素
     * @param ele
     */
    add(ele) {
        this.dataStore[this.listSize++] = ele;
    }

    /**
     * 删除元素
     * @param ele
     * @returns {boolean}
     */
    remove(ele) {
        let index = this._find(ele);

        if (index > -1) {
            // 删除元素
            this.dataStore.splice(index, 1);
            --this.listSize;
            return true;
        }

        return false;
    }

    /**
     * 获取当前元素
     * @returns {*}
     */
    getElement() {
        return this.dataStore[this.pos];
    }

    /**
     * 判断是否包含某个元素
     * @param ele
     * @returns {boolean}
     */
    contains(ele) {
        return this._find(ele) > -1;
    }

    /**
     * 清空列表
     */
    clear() {
        this.dataStore = [];
        this.listSize = this.pos = 0;
    }

    /**
     * 在某个元素之后插入
     * @param ele
     * @param after
     * @returns {boolean}
     */
    insert(ele, after) {
        let index = this._find(ele);
        if (index > -1) {
            this.dataStore.splice(index + 1, 0, after);
            ++this.listSize;
            return true;
        }

        return false;
    }

    length() {
        return this.listSize;
    }

    /**
     * 移动到首位
     */
    front() {
        this.pos = 0;
    }

    /**
     * 移动到末尾
     */
    end() {
        this.pos = this.listSize - 1;
    }

    /**
     * 下移一位
     */
    next() {
        if (this.pos < this.listSize) {
            ++this.pos;
        }
    }

    /**
     * 上移一位
     */
    prev() {
        if (this.pos > 0) {
            --this.pos;
        }
    }

    /**
     * 获取指定位置
     * @returns {number|*}
     */
    curPos() {
        return this.pos;
    }

    /**
     * 转换成字符串
     */
    toString() {
        return this.dataStore.join(' ');
    }

}

let list = new List();
list.add("金海宾");
list.insert('金海宾', '金海芳')
list.insert('金海芳', '金梓轩')
console.log(list.toString());
console.log(list.contains('金海宾'))

for (list.front(); list.curPos() < list.length(); list.next()) {
    console.log(list.getElement());
}

list.clear();
console.log(list.toString() + 'asdfasdf');
